Modelling change as average lambdas

All taxa in Canada

These are models to evaluate the relationship between average population change and body size, trophic level, and lifespan traits, while accounting for differences in System and Class, and including a random effect by Binomial because the trait data was collected at the species level.

# omit rows with NAs to ensure all models have the same data
df <- na.omit(df_join)

# null model
m0 = lmer(avlambda ~ (1|Binomial), data = df)
m1 = lmer(avlambda ~ Class + (1|Binomial),  data = df)
m2 = lmer(avlambda ~ Class + System + (1|Binomial), data = df)
m3 = lmer(avlambda ~ System + (1|Binomial), data = df)

# adding traits

# body size only
# class should be in each model because body size is normalised within classes
m4 = lmer(avlambda ~ log10(BodySize) + Class + (1|Binomial),  data = df)
m5 = lmer(avlambda ~ log10(BodySize) + Class + System + (1|Binomial),  data = df)
m6 = lmer(avlambda ~ Class*log10(BodySize) + (1|Binomial),  data = df)
m7 = lmer(avlambda ~ System*log10(BodySize) + (1|Binomial),  data = df)

# trophic level only
m8 = lmer(avlambda ~ TrophicLevel + (1|Binomial),  data = df)
m9 = lmer(avlambda ~ TrophicLevel + Class + (1|Binomial),  data = df)
m10 = lmer(avlambda ~ TrophicLevel + System + (1|Binomial),  data = df)
m11 = lmer(avlambda ~ Class*TrophicLevel + (1|Binomial),  data = df)
m12 = lmer(avlambda ~ System*TrophicLevel + (1|Binomial),  data = df)

# lifespan only
m13 = lmer(avlambda ~ LifeSpan + (1|Binomial),  data = df)
m14 = lmer(avlambda ~ LifeSpan + Class + (1|Binomial),  data = df)
m15 = lmer(avlambda ~ LifeSpan + System + (1|Binomial),  data = df)
m16 = lmer(avlambda ~ Class*LifeSpan + (1|Binomial),  data = df)
m17 = lmer(avlambda ~ System*LifeSpan + (1|Binomial),  data = df)

# all three traits
m18 = lmer(avlambda ~ log10(BodySize) + TrophicLevel + Class + (1|Binomial),  data = df)
m19 = lmer(avlambda ~ log10(BodySize) + LifeSpan + Class + (1|Binomial),  data = df)
m20 = lmer(avlambda ~ TrophicLevel + LifeSpan + (1|Binomial),  data = df)
m21 = lmer(avlambda ~ log10(BodySize) + TrophicLevel + LifeSpan + Class + (1|Binomial),  data = df)

Model comparison

If we compare these models, their performance looks like…

compare_performance(m0, m1, m2, m3, # no traits
                    m4, m5, m6, m7, # body size
                    m8, m9, m10, m11, m12, # trophic level
                    m13, m14, m15, m16, m17, # lifespan
                    m18, m19, m20, m21, # variations of 2 or 3 traits
                    rank = TRUE) %>%
  kableExtra::kable() %>% kableExtra::kable_styling("striped")
Name Model AIC BIC R2_conditional R2_marginal ICC RMSE Sigma Performance_Score
m12 lmerMod -2651.267 -2592.219 0.0413731 0.0094439 0.0322336 0.1427925 0.1446303 0.8379973
m3 lmerMod -2666.747 -2637.224 0.0349035 0.0007474 0.0341816 0.1431983 0.1450023 0.5745691
m10 lmerMod -2649.471 -2608.138 0.0354866 0.0010076 0.0345137 0.1431630 0.1450241 0.5392917
m0 lmerMod -2684.811 -2667.097 0.0325788 0.0000000 0.0325788 0.1433753 0.1450729 0.5164743
m17 lmerMod -2623.293 -2576.055 0.0365969 0.0033761 0.0333334 0.1431466 0.1449834 0.5110802
m15 lmerMod -2651.300 -2615.871 0.0347394 0.0021111 0.0326974 0.1432675 0.1450350 0.5056986
m16 lmerMod -2589.740 -2518.884 0.0385925 0.0063139 0.0324836 0.1430507 0.1449479 0.4856007
m8 lmerMod -2666.887 -2637.363 0.0330917 0.0001807 0.0329170 0.1433455 0.1450991 0.4757294
m1 lmerMod -2654.451 -2613.118 0.0339812 0.0019198 0.0321231 0.1433232 0.1450916 0.4637138
m2 lmerMod -2636.451 -2583.309 0.0351686 0.0021078 0.0331306 0.1432270 0.1450821 0.4618045
m13 lmerMod -2668.538 -2644.919 0.0317925 0.0008493 0.0309695 0.1434783 0.1451340 0.4156715
m9 lmerMod -2637.685 -2584.543 0.0340077 0.0023287 0.0317529 0.1433392 0.1451380 0.3988362
m14 lmerMod -2638.940 -2591.702 0.0335183 0.0032561 0.0303611 0.1434197 0.1451401 0.3776914
m20 lmerMod -2650.669 -2615.241 0.0323303 0.0010789 0.0312851 0.1434484 0.1451596 0.3759119
m11 lmerMod -2607.580 -2524.914 0.0356611 0.0038038 0.0319790 0.1432384 0.1451625 0.3559951
m7 lmerMod -2643.771 -2596.534 0.0323589 0.0043887 0.0280935 0.1435603 0.1451840 0.3200997
m5 lmerMod -2630.666 -2571.619 0.0324460 0.0050948 0.0274913 0.1436104 0.1452584 0.2542953
m4 lmerMod -2648.196 -2600.958 0.0311099 0.0045838 0.0266482 0.1437039 0.1452699 0.2509495
m19 lmerMod -2630.875 -2577.732 0.0314697 0.0049435 0.0266579 0.1436879 0.1452776 0.2140060
m18 lmerMod -2630.892 -2571.845 0.0315945 0.0048046 0.0269192 0.1436724 0.1452959 0.2110833
m6 lmerMod -2620.280 -2549.423 0.0325899 0.0065090 0.0262518 0.1436427 0.1452829 0.2090385
m21 lmerMod -2613.681 -2548.729 0.0318966 0.0052128 0.0268237 0.1436640 0.1453068 0.1706839

“Best” model(s) evaluation

Let’s look at the top models!

Model 12 : avlambda ~ System*TrophicLevel + (1|Binomial)

check_model(m12)

plot_model(m12, type="pred")


Mammals in Canada

These are models to evaluate the relationship between average population change and body size, trophic level, and lifespan traits, while accounting for differences in System, and including a random effect by Binomial because the trait data was collected at the species level. The Class variable is not included in these models, because the data is subset within the Mammals class.

df_taxon = filter(df_join, Class == "Mammals") %>% na.omit()

# null model
m0 = lmer(avlambda ~ (1|Binomial), data = df_taxon)
m1 = lmer(avlambda ~ System + (1|Binomial), data = df_taxon)

# adding traits

# body size only
# class should be in each model because body size is normalised within classes
m2 = lmer(avlambda ~ log10(BodySize) + (1|Binomial),  data = df_taxon)
m3 = lmer(avlambda ~ log10(BodySize) + System + (1|Binomial),  data = df_taxon)
m4 = lmer(avlambda ~ System*log10(BodySize) + (1|Binomial),  data = df_taxon)

# trophic level only
m5 = lmer(avlambda ~ TrophicLevel + (1|Binomial),  data = df_taxon)
m6 = lmer(avlambda ~ TrophicLevel + System + (1|Binomial),  data = df_taxon)
m7 = lmer(avlambda ~ System*TrophicLevel + (1|Binomial),  data = df_taxon)

# lifespan only
m8 = lmer(avlambda ~ LifeSpan + (1|Binomial),  data = df_taxon)
m9 = lmer(avlambda ~ LifeSpan + System + (1|Binomial),  data = df_taxon)
m10 = lmer(avlambda ~ System*LifeSpan + (1|Binomial),  data = df_taxon)

# all three traits
m11 = lmer(avlambda ~ log10(BodySize) + TrophicLevel + (1|Binomial),  data = df_taxon)
m12 = lmer(avlambda ~ log10(BodySize) + LifeSpan + (1|Binomial),  data = df_taxon)
m13 = lmer(avlambda ~ TrophicLevel + LifeSpan + (1|Binomial),  data = df_taxon)
m14 = lmer(avlambda ~ log10(BodySize) + TrophicLevel + LifeSpan + (1|Binomial),  data = df_taxon)

Model comparison

compare_performance(m0, m1, # no traits
                    m2, m3, m4, # body size
                    m5, m6, m7, # trophic
                    m8, m9, m10, # lifespan
                    m11, m12, m13, m14, # combos of traits
                    rank = TRUE) %>%
  kableExtra::kable() %>% kableExtra::kable_styling("striped")
Name Model AIC BIC R2_conditional R2_marginal ICC RMSE Sigma Performance_Score
m5 lmerMod -510.2379 -489.1949 0.1623360 0.0053920 0.1577948 0.1293784 0.1341837 0.7524747
m13 lmerMod -494.5324 -469.2809 0.1644064 0.0055093 0.1597774 0.1293237 0.1342535 0.6720469
m6 lmerMod -500.1311 -470.6709 0.1624907 0.0145367 0.1501365 0.1295234 0.1343726 0.6483838
m7 lmerMod -496.9368 -463.2681 0.1643309 0.0151153 0.1515056 0.1294144 0.1343950 0.6466554
m0 lmerMod -524.3005 -511.6748 0.1488905 0.0000000 0.1488905 0.1298620 0.1343833 0.6276346
m8 lmerMod -508.3950 -491.5606 0.1522503 0.0001447 0.1521276 0.1297337 0.1344028 0.5745688
m9 lmerMod -497.5250 -472.2735 0.1578560 0.0052733 0.1533916 0.1295625 0.1344217 0.5723689
m10 lmerMod -478.5389 -444.8701 0.1662056 0.0094111 0.1582841 0.1292813 0.1343960 0.5700837
m1 lmerMod -511.8965 -490.8535 0.1522218 0.0018971 0.1506105 0.1297840 0.1345105 0.5614567
m11 lmerMod -502.3802 -477.1286 0.1532002 0.0168717 0.1386681 0.1300086 0.1345656 0.5042814
m3 lmerMod -502.6838 -477.4322 0.1482869 0.0067919 0.1424626 0.1301205 0.1347738 0.3938685
m14 lmerMod -490.8208 -461.3607 0.1518389 0.0303202 0.1253184 0.1302834 0.1346906 0.3929105
m2 lmerMod -515.2096 -498.3752 0.1409094 0.0067402 0.1350797 0.1304035 0.1347611 0.3851969
m4 lmerMod -494.1201 -460.4514 0.1515392 0.0114927 0.1416747 0.1300247 0.1348708 0.3591872
m12 lmerMod -503.7635 -482.7205 0.1416670 0.0251471 0.1195255 0.1307862 0.1349347 0.2824476

“Best” model(s) evaluation

The two best models are two of the null options (m0 and m1). However, let’s take a look at the best model with traits included:

Model 5: avlambda ~ TrophicLevel + (1|Binomial)

check_model(m5)

plot_model(m5, type="pred")

plot_model(m5, type="re")
## Warning in checkMatrixPackageVersion(): Package version inconsistency detected.
## TMB was built with Matrix version 1.2.18
## Current Matrix version is 1.3.2
## Please re-install 'TMB' from source using install.packages('TMB', type = 'source') or ask CRAN for a binary version of 'TMB' matching CRAN's 'Matrix' package

Model 13: avlambda ~ TrophicLevel + LifeSpan + (1|Binomial)

check_model(m13)

plot_model(m13, type="pred")

plot_model(m13, type="re")

Birds in Canada

bird_df = filter(df, Class == "Birds")

# null model
m0_b = lmer(avlambda ~ (1|Binomial), data = bird_df)
m1_b = lmer(avlambda ~ System + (1|Binomial), data = bird_df)

# adding traits

# body size only
# class should be in each model because body size is normalised within classes
m2_b = lmer(avlambda ~ log10(BodySize) + (1|Binomial),  data = bird_df)
m3_b = lmer(avlambda ~ log10(BodySize) + System + (1|Binomial),  data = bird_df)
m4_b = lmer(avlambda ~ System*log10(BodySize) + (1|Binomial),  data = bird_df)

# trophic level only
m5_b = lmer(avlambda ~ TrophicLevel + (1|Binomial),  data = bird_df)
m6_b = lmer(avlambda ~ TrophicLevel + System + (1|Binomial),  data = bird_df)
m7_b = lmer(avlambda ~ System*TrophicLevel + (1|Binomial),  data = bird_df)

# lifespan only
m8_b = lmer(avlambda ~ LifeSpan + (1|Binomial),  data = bird_df)
m9_b = lmer(avlambda ~ LifeSpan + System + (1|Binomial),  data = bird_df)
m10_b = lmer(avlambda ~ System*LifeSpan + (1|Binomial),  data = bird_df)

# all three traits
m11_b = lmer(avlambda ~ log10(BodySize) + TrophicLevel + (1|Binomial),  data = df)
m12_b = lmer(avlambda ~ log10(BodySize) + LifeSpan + (1|Binomial),  data = df)
m13_b = lmer(avlambda ~ TrophicLevel + LifeSpan + (1|Binomial),  data = df)
m14_b = lmer(avlambda ~ log10(BodySize) + TrophicLevel + LifeSpan + (1|Binomial),  data = df)

Modelling change as summed lambdas

All taxa in Canada

These are models to evaluate the relationship between summed population change and body size, trophic level, and lifespan traits, while accounting for differences in System and Class, and including a random effect by Binomial because the trait data was collected at the species level. Each model includes time series length to account for differences in summed lambdas in shorter vs. longer time series.

# null model
m0 = lmer(sumlambda ~ (1|Binomial) + tslength, data = df)
m1 = lmer(sumlambda ~ Class + (1|Binomial) + tslength,  data = df)
m2 = lmer(sumlambda ~ Class + System + (1|Binomial) + tslength, data = df)
m3 = lmer(sumlambda ~ System + (1|Binomial) + tslength, data = df)

# adding traits

# body size only
# class should be in each model because body size is normalised within classes
m4 = lmer(sumlambda ~ log10(BodySize) + Class + (1|Binomial) + tslength,  data = df)
m5 = lmer(sumlambda ~ log10(BodySize) + Class + System + (1|Binomial) + tslength,  data = df)
m6 = lmer(sumlambda ~ Class*log10(BodySize) + (1|Binomial) + tslength,  data = df)
m7 = lmer(sumlambda ~ System*log10(BodySize) + (1|Binomial) + tslength,  data = df)

# trophic level only
m8 = lmer(sumlambda ~ TrophicLevel + (1|Binomial) + tslength,  data = df)
m9 = lmer(sumlambda ~ TrophicLevel + Class + (1|Binomial) + tslength,  data = df)
m10 = lmer(sumlambda ~ TrophicLevel + System + (1|Binomial) + tslength,  data = df)
m11 = lmer(sumlambda ~ Class*TrophicLevel + (1|Binomial) + tslength,  data = df)
m12 = lmer(sumlambda ~ System*TrophicLevel + (1|Binomial) + tslength,  data = df)

# lifespan only
m13 = lmer(sumlambda ~ LifeSpan + (1|Binomial) + tslength,  data = df)
m14 = lmer(sumlambda ~ LifeSpan + Class + (1|Binomial) + tslength,  data = df)
m15 = lmer(sumlambda ~ LifeSpan + System + (1|Binomial) + tslength,  data = df)
m16 = lmer(sumlambda ~ Class*LifeSpan + (1|Binomial) + tslength,  data = df)
m17 = lmer(sumlambda ~ System*LifeSpan + (1|Binomial) + tslength,  data = df)

# all three traits
m18 = lmer(sumlambda ~ log10(BodySize) + TrophicLevel + Class + (1|Binomial) + tslength,  data = df)
m19 = lmer(sumlambda ~ log10(BodySize) + LifeSpan + Class + (1|Binomial) + tslength,  data = df)
m20 = lmer(sumlambda ~ TrophicLevel + LifeSpan + (1|Binomial) + tslength,  data = df)
m21 = lmer(sumlambda ~ log10(BodySize) + TrophicLevel + LifeSpan + Class + (1|Binomial) + tslength,  data = df)

Model comparison

compare_performance(m0, m1, m2, m3, # no traits
                    m4, m5, m6, m7, # body size
                    m8, m9, m10, m11, m12, # trophic level
                    m13, m14, m15, m16, m17, # lifespan
                    m18, m19, m20, m21, # variations of 2 or 3 traits
                    rank = TRUE) %>%
  kableExtra::kable() %>% kableExtra::kable_styling("striped")
Name Model AIC BIC R2_conditional R2_marginal ICC RMSE Sigma Performance_Score
m6 lmerMod 6085.413 6162.174 0.0777289 0.0187221 0.0601326 0.7041076 0.7184480 0.6850224
m16 lmerMod 6125.509 6202.270 0.0777050 0.0138256 0.0647750 0.7035225 0.7186127 0.6342115
m7 lmerMod 6085.756 6138.899 0.0737833 0.0113476 0.0631524 0.7046896 0.7191119 0.5812964
m2 lmerMod 6083.183 6142.230 0.0737357 0.0118943 0.0625858 0.7047351 0.7191884 0.5646301
m5 lmerMod 6090.942 6155.894 0.0742245 0.0117707 0.0631977 0.7045316 0.7191726 0.5636350
m3 lmerMod 6075.776 6111.204 0.0708416 0.0062851 0.0649648 0.7053252 0.7197463 0.5125315
m12 lmerMod 6090.633 6155.585 0.0727079 0.0088129 0.0644632 0.7047738 0.7196477 0.4981276
m10 lmerMod 6085.534 6132.772 0.0714010 0.0068801 0.0649679 0.7052124 0.7198351 0.4764865
m4 lmerMod 6085.869 6139.011 0.0726720 0.0103830 0.0629425 0.7054233 0.7198249 0.4579336
m15 lmerMod 6089.935 6131.268 0.0710704 0.0067219 0.0647839 0.7053463 0.7198411 0.4493252
m1 lmerMod 6078.650 6125.888 0.0714208 0.0093547 0.0626522 0.7056092 0.7198683 0.4413824
m18 lmerMod 6096.690 6161.642 0.0732824 0.0102757 0.0636608 0.7051836 0.7199024 0.4383101
m11 lmerMod 6104.555 6193.126 0.0741484 0.0100551 0.0647444 0.7047304 0.7200396 0.4334362
m9 lmerMod 6089.434 6148.482 0.0721116 0.0093261 0.0633766 0.7053586 0.7199361 0.4253401
m19 lmerMod 6100.114 6159.161 0.0729914 0.0106807 0.0629834 0.7053857 0.7198968 0.4050508
m14 lmerMod 6092.583 6145.725 0.0720631 0.0101659 0.0625328 0.7055692 0.7199125 0.3975513
m21 lmerMod 6110.972 6181.828 0.0736188 0.0105747 0.0637178 0.7051466 0.7199778 0.3857036
m17 lmerMod 6113.370 6166.512 0.0717156 0.0068674 0.0652966 0.7051451 0.7199209 0.3800143
m0 lmerMod 6064.151 6087.769 0.0677193 0.0055095 0.0625545 0.7063287 0.7201826 0.3653794
m8 lmerMod 6075.474 6110.902 0.0683438 0.0056465 0.0630533 0.7061850 0.7203095 0.3321321
m13 lmerMod 6078.149 6107.673 0.0682456 0.0061279 0.0625008 0.7062696 0.7202186 0.3209662
m20 lmerMod 6089.349 6130.682 0.0688975 0.0063877 0.0629117 0.7061461 0.7203513 0.2859953

“Best” model(s) evaluation

Model 6: sumlambda ~ Class*log10(BodySize) + (1|Binomial) + tslength

check_model(m6)

plot_model(m6, type="pred")
## Warning: Removed 1 row(s) containing missing values (geom_path).

Model 16: sumlambda ~ Class*LifeSpan + (1|Binomial) + tslength

check_model(m16)

plot_model(m16, type="pred")

Mammals in Canada

These are models to evaluate the relationship between summed population change and body size, trophic level, and lifespan traits, while accounting for differences in System and Class, and including a random effect by Binomial because the trait data was collected at the species level. Each model includes time series length to account for differences in summed lambdas in shorter vs. longer time series.

# null model
m0 = lmer(sumlambda ~ (1|Binomial), data = df_taxon)
m1 = lmer(sumlambda ~ System + (1|Binomial), data = df_taxon)

# adding traits

# body size only
# class should be in each model because body size is normalised within classes
m2 = lmer(sumlambda ~ log10(BodySize) + (1|Binomial) + tslength,  data = df_taxon)
m3 = lmer(sumlambda ~ log10(BodySize) + System + (1|Binomial) + tslength,  data = df_taxon)
m4 = lmer(sumlambda ~ System*log10(BodySize) + (1|Binomial) + tslength,  data = df_taxon)

# trophic level only
m5 = lmer(sumlambda ~ TrophicLevel + (1|Binomial) + tslength,  data = df_taxon)
m6 = lmer(sumlambda ~ TrophicLevel + System + (1|Binomial) + tslength,  data = df_taxon)
m7 = lmer(sumlambda ~ System*TrophicLevel + (1|Binomial) + tslength,  data = df_taxon)

# lifespan only
m8 = lmer(sumlambda ~ LifeSpan + (1|Binomial) + tslength,  data = df_taxon)
m9 = lmer(sumlambda ~ LifeSpan + System + (1|Binomial) + tslength,  data = df_taxon)
m10 = lmer(sumlambda ~ System*LifeSpan + (1|Binomial) + tslength,  data = df_taxon)

# all three traits
m11 = lmer(sumlambda ~ log10(BodySize) + TrophicLevel + (1|Binomial) + tslength,  data = df_taxon)
m12 = lmer(sumlambda ~ log10(BodySize) + LifeSpan + (1|Binomial) + tslength,  data = df_taxon)
m13 = lmer(sumlambda ~ TrophicLevel + LifeSpan + (1|Binomial) + tslength,  data = df_taxon)
m14 = lmer(sumlambda ~ log10(BodySize) + TrophicLevel + LifeSpan + (1|Binomial) + tslength,  data = df_taxon)

Model comparison

compare_performance(m0, m1, # no traits
                    m2, m3, m4, # body size
                    m5, m6, m7, # trophic
                    m8, m9, m10, # lifespan
                    m11, m12, m13, m14, # combos of traits
                    rank = TRUE) %>%
  kableExtra::kable() %>% kableExtra::kable_styling("striped")
Name Model AIC BIC R2_conditional R2_marginal ICC RMSE Sigma Performance_Score
m5 lmerMod 784.1246 809.3762 0.2109302 0.0288631 0.1874783 0.4684271 0.4881286 0.6225298
m0 lmerMod 775.5362 788.1620 0.2197032 0.0000000 0.2197032 0.4690844 0.4897047 0.6204866
m6 lmerMod 789.8921 823.5608 0.2159069 0.0347315 0.1876943 0.4681072 0.4884065 0.6166900
m7 lmerMod 790.9240 828.8013 0.2178949 0.0345982 0.1898657 0.4678565 0.4886512 0.6163295
m1 lmerMod 780.7965 801.8394 0.2234830 0.0075667 0.2175626 0.4688007 0.4898477 0.6156548
m13 lmerMod 797.0486 826.5087 0.2138352 0.0284946 0.1907767 0.4679915 0.4881880 0.5773345
m11 lmerMod 791.5353 820.9954 0.2130763 0.0325606 0.1865912 0.4685419 0.4884660 0.5515631
m3 lmerMod 789.9361 819.3962 0.2112450 0.0299819 0.1868657 0.4689556 0.4889761 0.4730028
m14 lmerMod 801.7993 835.4681 0.2147028 0.0409487 0.1811729 0.4686776 0.4886182 0.4714534
m9 lmerMod 793.6221 823.0823 0.2107579 0.0351814 0.1819788 0.4689738 0.4888020 0.4581151
m4 lmerMod 790.2835 828.1608 0.2120235 0.0456886 0.1742984 0.4692285 0.4892396 0.4266029
m10 lmerMod 808.0464 845.9237 0.2145461 0.0346141 0.1863835 0.4684847 0.4891742 0.3792799
m2 lmerMod 783.9024 804.9453 0.2056561 0.0309795 0.1802610 0.4701579 0.4892934 0.3730360
m8 lmerMod 789.5169 810.5599 0.2051556 0.0268012 0.1832662 0.4697856 0.4891288 0.3637547
m12 lmerMod 795.4514 820.7029 0.2114180 0.0385412 0.1798068 0.4700182 0.4894244 0.3482291

“Best” model(s) evaluation

Model 5: sumlambda ~ TrophicLevel + (1|Binomial) + tslength

check_model(m5)

plot_model(m5, type="pred")